home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Revista CD Expert 8
/
Revista CD Expert nº 08 CD1.iso
/
Utilitarios
/
Programacao
/
MS-DOS Interrupt List
/
inter60f
/
INT2RTF.ZIP
/
INT2RTF.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1997-07-07
|
63KB
|
1,601 lines
{ INT2RTF. Main module for the Interrupt List -> .RTF compiler.}
{ The software included, data formats and basic algorithms are }
{ copyright (C) 1996 by Slava Gostrenko. All rights reserved. }
{$M 16384}
{$IFNDEF DPMI}
! set Target to 'Protected Mode Application'
{$ENDIF}
{$X+}
program
Int2RTF;
uses
Upcaser, Objects, RTF;
var
FO: THelpFile;
IncompPattern: Text;
Hdrs: TStringCollection;
IntLists: array [Byte] of PTopic;
IntNames: array [Byte] of string [12];
KeyLists: TCollection;
KeyNames: TCollection;
IntList: PTopic;
IntListName: string;
Tables: PTopic;
TablesName: string;
CMOS: PTopic;
CMOSName: string;
FARCall: PTopic;
FARCallName: string;
Memory: PTopic;
MemoryName: string;
MSR: PTopic;
MSRName: string;
OpCodes: PTopic;
OpCodesName: string;
Ports: PTopic;
PortSName: string;
IntListIndex: PTopic;
IntListIndexName: string;
Interrup1st: Text;
CopyrightStr: string;
const HexCh: array [0..$F] of Char = '0123456789ABCDEF';
function HexWord (W: Word): string;
begin
HexWord := HexCh[Hi(W) shr 4] + HexCh[Hi(W) and $F]
+ HexCh[Lo(W) shr 4] + HexCh[Lo(W) and $F];
end;
function HexByte (B: Byte): string;
begin
HexByte := HexCh[B shr 4] + HexCh[B and $F];
end;
function MemInitSwapFile(FileName: PChar; FileSize: Longint): Integer; far; external 'RTM' Index 35;
function MemCloseSwapFile(Delete: Integer): Integer; far; external 'RTM' Index 36;
function MakeCorrectTopicName (const TopicName: string): string;
var
I: Integer;
V: Integer;
AddChar, TstTopic: string;
Rez: string;
begin
Rez := TopicName;
V := 0;
AddChar := '';
TstTopic := StUpcase2 (Rez);
while Hdrs. Search (@TstTopic, I) do begin
Dec (Rez [0], Length (AddChar));
Inc (V);
if V > 99 then
WriteLn ('error 3');
System. Str (V, AddChar);
if Length (AddChar) = 1 then
AddChar := '_0' + AddChar
else
AddChar := '_' + AddChar;
Rez := Rez + AddChar;
TstTopic := StUpcase2 (Rez);
end;
Hdrs. Insert (NewStr (TstTopic));
MakeCorrectTopicName := Rez;
end;
function ProcessPattern (var Str: string; var Pos: Integer;
Pattern: string; Keyword: string;
Topic: PTopic; StepBack: Integer): Boolean;
var I, J: Integer;
begin
I := 1;
while I <= Length (Pattern) do begin
if Pattern [I] in [#3, #6] then
if Upcase [Str [Pos + I - 1]] in HexChars + ['X'] then begin
J := System. Pos (#3, Keyword);
if J > 0 then
Keyword [J] := Str [Pos + I - 1]
else
if Pattern [I] = #3 then begin
WriteLn (Str);
WriteLn ('error in keyword pattern (1) ', Pattern, ' ', Keyword);
ProcessPattern := False;
Exit;
end;
end else begin
ProcessPattern := False;
Exit;
end
else
if Pattern [I] in [#4, #7] then begin
if ( (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
or ( (Upcase [Str [Pos + I - 1]] in ['S', 'D'])
and (Upcase [Str [Pos + I]] = 'I'))
or ( (Upcase [Str [Pos + I - 1]] in ['B', 'S'])
and (Upcase [Str [Pos + I]] = 'P'))
or ( (Upcase [Str [Pos + I - 1]] in ['D', 'E', 'S', 'F', 'G'])
and (Upcase [Str [Pos + I]] = 'S'))
or ( (Upcase [Str [Pos + I - 1]] = 'S')
and (Upcase [Str [Pos + I]] = 'F'))
or ( (Upcase [Str [Pos + I - 1]] = 'V')
and (Upcase [Str [Pos + I]] = 'X'))
then begin
J := System. Pos (#4, Keyword);
if J > 0 then begin
Keyword [J] := Str [Pos + I - 1];
Keyword [J + 1] := Str [Pos + I];
Inc (I);
end else
if Pattern [I] = #4 then begin
WriteLn (Str);
WriteLn ('error in keyword pattern (2) ', Pattern, ' ', Keyword);
ProcessPattern := False;
Exit;
end else
Inc (I);
end else begin
ProcessPattern := False;
Exit;
end
end else
if Pattern [I] in [#5, #8] then begin
if ( (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
or ( (Upcase [Str [Pos + I - 1]] = 'S')
and (Upcase [Str [Pos + I]] = 'F'))
or ( (Upcase [Str [Pos + I - 1]] = 'V')
and (Upcase [Str [Pos + I]] = 'X'))
then begin
J := System. Pos (#5, Keyword);
if J > 0 then begin
Keyword [J] := Str [Pos + I - 1];
Keyword [J + 1] := Str [Pos + I];
Inc (I);
end else
if Pattern [I] = #5 then begin
WriteLn (Str);
WriteLn ('error in keyword pattern (3) ', Pattern, ' ', Keyword);
ProcessPattern := False;
Exit;
end else
Inc (I);
end else begin
ProcessPattern := False;
Exit;
end
end else
if ((Pattern [I] = 'X') and (Upcase [Str [Pos + I - 1]] in ['L', 'H']))
or ((Pattern [I] in ['L', 'H']) and (Upcase [Str [Pos + I - 1]] = 'X'))
then
{Ok}
else
if Pattern [I] = 'H' then begin
if Upcase [Str [Pos + I - 1]] <> 'H' then begin
Delete (Pattern, I, 1);
Dec (I);
end;
end else
if Upcase [Str [Pos + I - 1]] <> Upcase [Pattern [I]] then begin
ProcessPattern := False;
Exit;
end;
Inc (I);
end;
{Once user's request for pattern with helper was confirmed}
{make the pattern suitable for helper string analizis. }
if Pattern [Length (Pattern)] = '"' then
Dec (Pattern [0]);
if (Pos + Length (Pattern) - 1 > Length (Str))
and (Pattern [Length (Pattern)] in ['h', 'H']) then
Dec (Pattern [0]);
if Pos + Length (Pattern) - 1 <= Length (Str) then begin
if (System. Pos (#3, Keyword) > 0)
or (System. Pos (#4, Keyword) > 0)
or (System. Pos (#5, Keyword) > 0) then begin
WriteLn (Str);
WriteLn ('error in keyword pattern (4) ', Pattern, ' ', Keyword);
end;
if (Length (Keyword) < 13)
and (Pos + Length (Pattern) <= Length (Str))
and (Str [Pos + Length (Pattern)] in (['/', 'h', 'H', ':', '-'] + HexChars))
and (Pos + Length (Pattern) + 1 <= Length (Str))
and (not (Str [Pos + Length (Pattern) + 1] in ['I', 'R', 'W', '-', ' ']))
then begin
WriteLn (IncompPattern, Str);
WriteLn (IncompPattern, 'not a complete pattern ', Pattern, ' for keyword ', Keyword);
end;
if (Pos + Length (Pattern) <= Length (Str))
and (Str [Pos + Length (Pattern)] = '"') then begin
Keyword := Keyword + '"';
I := Pos + Length (Pattern) + 1;
while (I <= Length (Str)) and (Str [I] <> '"') do begin
Keyword := Keyword + Str [I];
Inc (I);
end;
if I <= Length (Str) then begin
Keyword := Keyword + '"';
if Copy (Keyword, 1, 4) = 'INT ' then
Delete (Keyword, 1, 4);
end else
Delete (Keyword, System.Pos ('"', Keyword), Length (Keyword));
end;
Topic^. AddKeyword (Keyword, StepBack);
Insert (#2, Str, Pos + Length (Pattern));
Insert (#2, Str, Pos);
Inc (Pos, Length (Pattern) + 1);
ProcessPattern := True;
end else
ProcessPattern := False;
end;
function SkipPattern (var Str: string; var Pos: Integer;
Pattern: string): Boolean;
var I, J: Integer;
begin
I := 1;
while I <= Length (Pattern) do begin
if Pattern [I] = #3 then
if Upcase [Str [Pos + I - 1]] in HexChars + ['X'] then begin
{Ok}
end else begin
SkipPattern := False;
Exit;
end
else
if Pattern [I] = #4 then begin
if ( (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
or ( (Upcase [Str [Pos + I - 1]] in ['S', 'D'])
and (Upcase [Str [Pos + I]] = 'I'))
or ( (Upcase [Str [Pos + I - 1]] in ['B', 'S'])
and (Upcase [Str [Pos + I]] = 'P'))
or ( (Upcase [Str [Pos + I - 1]] in ['D', 'E', 'S', 'F', 'G'])
and (Upcase [Str [Pos + I]] = 'S'))
or ( (Upcase [Str [Pos + I - 1]] = 'S')
and (Upcase [Str [Pos + I]] = 'F'))
or ( (Upcase [Str [Pos + I - 1]] = 'V')
and (Upcase [Str [Pos + I]] = 'X'))
then begin
{Ok}
end else begin
SkipPattern := False;
Exit;
end
end else
if Pattern [I] = #5 then begin
if ( (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
or ( (Upcase [Str [Pos + I - 1]] = 'S')
and (Upcase [Str [Pos + I]] = 'F'))
or ( (Upcase [Str [Pos + I - 1]] = 'V')
and (Upcase [Str [Pos + I]] = 'X'))
then begin
{Ok}
end else begin
SkipPattern := False;
Exit;
end
end else
if ((Pattern [I] = 'X') and (Upcase [Str [Pos + I - 1]] in ['L', 'H']))
or ((Pattern [I] in ['L', 'H']) and (Upcase [Str [Pos + I - 1]] = 'X'))
then
{Ok}
else
if Pattern [I] = 'H' then begin
if Upcase [Str [Pos + I - 1]] <> 'H' then begin
Delete (Pattern, I, 1);
Dec (I);
end;
end else
if Upcase [Str [Pos + I - 1]] <> Upcase [Pattern [I]] then begin
SkipPattern := False;
Exit;
end;
Inc (I);
end;
if Pos + Length (Pattern) - 1 <= Length (Str) then begin
if (Pos + Length (Pattern) <= Length (Str))
and (Str [Pos + Length (Pattern)] in (['/', 'h', 'H', ':', '-'] + HexChars))
and (Pos + Length (Pattern) + 1 <= Length (Str))
and (not (Str [Pos + Length (Pattern) + 1] in ['I', 'R', 'W', '-', ' ']))
then begin
WriteLn (IncompPattern, Str);
WriteLn (IncompPattern, 'not a complete pattern ', Pattern);
end;
Inc (Pos, Length (Pattern) - 1);
SkipPattern := True;
end else
SkipPattern := False;
end;
procedure AddStr2Topic (Str: string; var Topic: PTopic;
var TopicName: string; const CurInt, CurSubF, CurCat: string;
Indexed: Boolean);
var I: Integer;
KeyCnt: Integer;
begin
KeyCnt := 0;
for I := 1 to Length (Str) do
if Str [I] = #2 then
Inc (KeyCnt);
I := 1;
while I <= Length (Str) do begin
if Str [I] = #2 then
Dec (KeyCnt);
if not Odd (KeyCnt) then
if (I + 4 <= Length (Str))
and (Str [I] = '#')
and (Str [I + 1] in ['0'..'9', 'C', 'F', 'M', 'R', 'P'])
and (Str [I + 2] in ['0'..'9'])
and (Str [I + 3] in ['0'..'9'])
and (Str [I + 4] in ['0'..'9'])
then begin
Topic^. AddKeyword (Copy (Str, I, 5), KeyCnt div 2);
Insert (#2, Str, I + 5);
Insert (#2, Str, I);
Inc (I, 6);
end else
if (I = 1)
or (not (Upcase [Str [I - 1]] in ['A'..'Z', '0'..'9'])) then
case Upcase [Str [I]] of
'I':
if ProcessPattern (Str, I, 'INT '#3#3'H/AX='#3#3#3#3'H/'#4#4'='#3#3#3#3'H',
#3#3#3#3#3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT 13/AX=2000H/DL=81H', '1320' + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AX='#3#3#3#3'H/'#5#5'='#3#3'H',
#3#3#3#3#3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT 21/AX=4202H/CX=0/DX=0', '2142' + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AX='#6#6#6#6'H-'#6#6#6#6'H',
'INT '#3#3, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AX='#3#3#3#3'H',
#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3#3#3'H',
#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3'H/'#4#4'='#3#3#3#3'H',
#3#3#3#3'--'#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3'H/'#5#5'='#3#3'H',
#3#3#3#3'--'#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#6#6'H-'#6#6'H',
'INT '#3#3, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3'H',
#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AL='#3#3'H/'#4#4'='#3#3#3#3'H',
#3#3'--'#3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AL='#3#3'H/'#5#5'='#3#3'H',
#3#3'--'#3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/AL='#3#3'H',
#3#3'--'#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/'#4#4'='#3#3#3#3'H',
#3#3'----'#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/'#5#5'='#3#3'H',
#3#3'----'#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/'#3#3#3#3'H',
#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/'#6#6'H-'#6#6'H',
'INT '#3#3, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H/'#3#3'H',
#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#6#6'-INT '#6#6'H',
'TITLES', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#6#6'-'#6#6'H',
'TITLES', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT XXH',
'TITLES', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'INT '#3#3'H',
'INT '#3#3, Topic, KeyCnt div 2)
then
;
'A':
if ProcessPattern (Str, I, 'AX='#3#3#3#3'H/'#4#4'='#3#3#3#3'H',
CurInt + #3#3#3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AX='#3#3#3#3'H/'#5#5'='#3#3'H',
CurInt + #3#3#3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AX='#6#6#6#6'H-'#6#6#6#6'H',
'INT ' + CurInt, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AX='#3#3#3#3'H',
CurInt + #3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AH='#3#3'H/AL='#3#3'H',
CurInt + #3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AH='#3#3'H/'#4#4'='#3#3#3#3'H',
CurInt + #3#3'--'#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AH='#3#3'H/'#5#5'='#3#3'H',
CurInt + #3#3'--'#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AH='#6#6'H-'#6#6'H',
'INT ' + CurInt, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AH='#3#3'H',
CurInt + #3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AL='#3#3'H/'#4#4'='#3#3#3#3'H',
CurInt + Copy (CurSubF, 1, 2) + #3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AL='#3#3'H/'#5#5'='#3#3'H',
CurInt + Copy (CurSubF, 1, 2) + #3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AL='#6#6'H/'#6#6'H',
CurInt + Copy (CurSubF, 1, 2) + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AL='#6#6'H-'#6#6'H',
CurInt + Copy (CurSubF, 1, 2) + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'AL='#3#3'H',
CurInt + Copy (CurSubF, 1, 2) + #3#3 + CurCat, Topic, KeyCnt div 2)
then
;
'B', 'C', 'D', 'S', 'E', 'F', 'G', 'V':
if ProcessPattern (Str, I, #4#4'='#3#3#3#3'H',
CurInt + CurSubF + #4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or SkipPattern (Str, I, 'CX=CX-1')
or ProcessPattern (Str, I, #8#8'='#6#6'H/'#6#6'H',
CurInt + CurSubF + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, #8#8'='#6#6'H-'#6#6'H',
CurInt + CurSubF + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, #5#5'='#3#3'H',
CurInt + CurSubF + #5#5#3#3 + CurCat, Topic, KeyCnt div 2)
then
{nothing}
else
if Upcase [Str [I]] = 'C' then begin
if ProcessPattern (Str, I, 'CMOS DATA',
'CMOS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CMOS 8086/88',
'CMOS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CMOS 80C86/88',
'CMOS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CMOS '#3#3#3#3'H',
'R'#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CMOS '#3#3'H-'#3#3'H',
'R'#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CMOS '#3#3'H',
'R'#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CMOS',
'CMOS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CALL XXXXH:XXXXH"',
'@xxxxxxxx', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CALL XXXXH:XXXXH',
'FAR CALLS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'CALL '#3#3#3#3'H:'#3#3#3#3'H',
'@'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
then
;
end;
'@':
if ProcessPattern (Str, I, '@XXXXH:XXXXH"',
'@xxxxxxxx', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, '@XXXXH:XXXXH',
'FAR CALLS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, '@'#3#3#3#3'H:'#3#3#3#3'H',
'@'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
then
;
'M':
if ProcessPattern (Str, I, 'MEM '#6#6#6#6'H:xxxxH',
'MEMORY', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'MEM '#3#3#3#3'H:'#3#3#3#3'H',
'M'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'MEM '#3#3#3#3#3#3#3#3'H',
'M'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'MSR '#3#3#3#3#3#3#3#3'H',
'S'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
then
;
'P':
if ProcessPattern (Str, I, 'PORT ACCESS',
'PORTS', Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H-'#3#3#3#3'H',
'P'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H-'#3#3#3'H',
'P'#3#3#3#3#3#3#3' ' + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H-????H',
'P'#3#3#3#3'????' + CurCat, Topic, KeyCnt div 2)
or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H',
'P'#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
then
;
end;
Inc (I);
end;
Topic^. AddString (' ' + Str);
end;
function NoLinks (S: string): string;
var I: Integer;
begin
I := Pos (#2, S);
while I > 0 do begin
Delete (S, I, 1);
I := Pos (#2, S);
end;
NoLinks := S;
end;
procedure Tab2Spc (var Str: string);
var I, J: Integer;
begin
I := Pos (#9, Str);
while I > 0 do begin
Delete (Str, I, 1);
for J := 7 downto ((I - 1) mod 8) do
Insert (' ', Str, I);
I := Pos (#9, Str);
end;
end;
function ProcessInterrup (const FileName: string; const FileIsATopic: string): Boolean;
type
DividerRec = record
Len: Byte;
S: array [0..7] of Char; (* '--------' *)
Cat: Char; (* category *)
C: Char; (* '-' *)
case Integer of
0: (Int: array [0..1] of Char; (* Interrupt number, 2 hex digits *)
SubF: array [0..3] of Char;(* sub function, 4 hex digits or '-' *)
R: array [0..1] of Char; (* Secondary Register Name, Two Letters or '--' *)
RV: array [0..3] of Char; (* sec. reg. value, 4 hex digits or '-' *)
Rest: array [0..17] of Char;
);
1: (RSign: Char;
R1,
R2: array [0..1] of Char;
);
2: (AtSign: Char;
CallSeg,
CallOfs: array [0..3] of Char;
);
3: (MSign: Char;
MemSeg,
MemOfs: array [0..3] of Char;
);
4: (SSign: Char;
MSR: array [0..7] of Char;
);
5: (PSign: Char;
P1,
P2: array [0..3] of Char;
);
6: (Cat2: Char; (* category *)
C2: Char; (* '-' *)
);
end; (* record dividerRec *)
T2W = record Lo, Hi: Word; end;
T22 = record Lo, Hi: array [0..1] of Char; end;
var
FI: Text;
Str, StrUp: string;
TopicName: string;
CurCat: string [1];
CurInt: string [2];
CurSubF: string [4];
DR: DividerRec absolute Str;
procedure ProcessHdr (Hdr: string);
begin
with DR do begin
if (S <> '--------')
or (not (Cat in ['A'..'Z', 'a'..'z', '!', '*', '-']))
or (C <> '-')
or ((Cat <> '!')
and
((Cat <> '-')
or (C2 <> '-')
or (Pos ('OPCODES', StUpcase2 (FileName)) = 0)
)
and
((not (RSign in ['R', 'r']))
or (not (R1 [0] in HexChars))
or (not (R1 [1] in HexChars))
or ( (R2 <> '--')
and ((not (R2 [0] in HexChars))
or (not (R2 [1] in HexChars)))
)
)
and
((not (AtSign = '@'))
or (not (CallSeg [0] in HexChars + ['x']))
or (not (CallSeg [1] in HexChars + ['x']))
or (not (CallSeg [2] in HexChars + ['x']))
or (not (CallSeg [3] in HexChars + ['x']))
or (not (CallOfs [0] in HexChars + ['x']))
or (not (CallOfs [1] in HexChars + ['x']))
or (not (CallOfs [2] in HexChars + ['x']))
or (not (CallOfs [3] in HexChars + ['x']))
)
and
((not (MSign in ['M', 'm']))
or (not (MemSeg [0] in HexChars + ['x']))
or (not (MemSeg [1] in HexChars + ['x']))
or (not (MemSeg [2] in HexChars + ['x']))
or (not (MemSeg [3] in HexChars + ['x']))
or (not (MemOfs [0] in HexChars + ['x']))
or (not (MemOfs [1] in HexChars + ['x']))
or (not (MemOfs [2] in HexChars + ['x']))
or (not (MemOfs [3] in HexChars + ['x']))
)
and
((not (SSign in ['S', 's']))
or (not (MSR [0] in HexChars))
or (not (MSR [1] in HexChars))
or (not (MSR [2] in HexChars))
or (not (MSR [3] in HexChars))
or (not (MSR [4] in HexChars))
or (not (MSR [5] in HexChars))
or (not (MSR [6] in HexChars))
or (not (MSR [7] in HexChars))
)
and
((not (PSign in ['P', 'p']))
or (not (P1 [0] in HexChars + ['x']))
or (not (P1 [1] in HexChars + ['x']))
or (not (P1 [2] in HexChars + ['x']))
or (not (P1 [3] in HexChars + ['x']))
or ( (P2 <> '----')
and (P2 <> '????')
and ((not (P2 [0] in HexChars))
or (not (P2 [1] in HexChars))
or (not (P2 [2] in HexChars))
or (not (P2 [3] in HexChars + ['x', ' '])))
)
)
and
((not (Int [0] in HexChars))
or (not (Int [1] in HexChars))
or ( (SubF <> '----')
and ((T22 (SubF). Lo <> '--')
or (not (SubF [2] in HexChars))
or (not (SubF [3] in HexChars)))
and ((T22 (SubF). Hi <> '--')
or (not (SubF [0] in HexChars))
or (not (SubF [1] in HexChars)))
and ((not (SubF [0] in HexChars))
or (not (SubF [1] in HexChars))
or (not (SubF [2] in HexChars))
or (not (SubF [3] in HexChars)))
)
or ( (R <> '--')
and ((R <> 'BX') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'CX') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'DX') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'SI') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'DI') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'SP') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'BP') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'ES') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'DS') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'BH') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'BL') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'CH') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'CL') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'DH') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'DL') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'SF') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
and ((R <> 'SF') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (T22 (RV). Hi <> '--'))
and ((R <> 'Vx') or (not (RV [0] in HexChars))
or (not (RV [1] in HexChars))
or (not (RV [2] in HexChars))
or (not (RV [3] in HexChars)))
)
or (Rest <> '------------------')
)
and
(Hdr <> '-----------------------------------------')
and
(Hdr <> '------------------------------------------')
and
(Hdr <> '--------------------------------------------')
and
(Hdr <> '---------------------------------------------')
and
(Hdr <> '----------------------------------------------')
and
(Hdr <> '------------------------------------------------')
and
(Hdr <> '-------------------------------------------------')
and
(Hdr <> '--------------------------------------------------')
and
(Hdr <> '---------------------------------------------------')
and
(Hdr <> '----------------------------------------------------')
and
(Hdr <> '-----------------------------------------------------')
and
(Hdr <> '------------------------------------------------------')
and
(Hdr <> '---------------------------------------------------------')
and
(Hdr <> '----------------------------------------------------------')
and
(Hdr <> '-----------------------------------------------------------')
and
(Hdr <> '------------------------------------------------------------')
and
(Hdr <> '-------------------------------------------------------------')
and
(Hdr <> '--------------------------------------------------------------')
)
then
WriteLn (' ': 79, #13, 'header error: ', Hdr);
if Cat = '!' then begin
TopicName := Copy (Str, 10, Length (Str) - 9);
CurInt := '';
CurSubF := '';
end else
if (Cat = '-') and (C2 = '-')
and (Pos ('OPCODES', StUpcase2 (FileName)) > 0) then begin
TopicName := Copy (Str, 12, Length (Str) - 11);
CurInt := '';
CurSubF := '';
end else
if RSign in ['R', 'r'] then begin
TopicName := RSign + R1 + R2;
CurInt := '';
CurSubF := '';
end else
if AtSign = '@' then begin
TopicName := AtSign + CallSeg + CallOfs;
CurInt := '';
CurSubF := '';
end else
if MSign in ['M', 'm'] then begin
TopicName := MSign + MemSeg + MemOfs;
CurInt := '';
CurSubF := '';
end else
if SSign in ['S', 's'] then begin
TopicName := SSign + MSR;
CurInt := '';
CurSubF := '';
end else
if PSign in ['P', 'p'] then begin
TopicName := PSign + P1 + P2;
CurInt := '';
CurSubF := '';
end else begin
TopicName := Int + SubF + R + RV;
CurInt := Int;
CurSubF := SubF;
end;
while TopicName [Length (TopicName)] in ['-', ' ', #9] do Dec (TopicName [0]);
if Length (TopicName) > 0 then
while TopicName [1] in ['-', ' ', #9] do Delete (TopicName, 1, 1)
else
TopicName := FileName;
if not (Cat in ['!', '-']) then begin
TopicName := TopicName + Cat;
CurCat := Cat;
end else
CurCat := '';
end;
end;
var
SectionStarted: Boolean;
SectionClosed: Boolean;
I, J: Integer;
Topic: PTopic;
ExtendedHeader: string;
OriginalTopicName: string;
TblStarted: Boolean;
TblClosed: Boolean;
TblTopic: PTopic;
TblTopicName: string;
PrevStr, SavePtr: PString;
AddNextStringToTopicAsATblRef: Boolean;
begin
Assign (FI, FileName);
{$I-}
Reset (FI);
if IOResult = 0 then begin
ProcessInterrup := True;
WriteLn ('processing ', FileName, ' ');
TblStarted := False;
TblClosed := True;
SectionStarted := False;
SectionClosed := True;
AddNextStringToTopicAsATblRef := False;
if FileIsATopic <> '' then begin
TopicName := FileIsATopic;
CurCat := '';
CurInt := '';
CurSubF := '';
New (Topic, Init (1, 1));
SectionStarted := True;
SectionClosed := False;
TopicName := MakeCorrectTopicName (TopicName);
OriginalTopicName := TopicName;
ExtendedHeader := #2 + TopicName + #2;
end;
while not EOF (FI) do begin
ReadLn (FI, Str);
if (Length (Str) > 0)
and (FileIsATopic = '')
and ((Str [1] = '-') and (Pos ('--------', Str) <> 0))
and (Str <> '--------------')
then begin
if not TblClosed then begin
TblTopic^.AddKeywordAtStart (OriginalTopicName);
TblTopic^.SetSubHeader (ExtendedHeader);
FO. IdxTbl. Insert (New (PIndexEntry, Init (
TblTopicName, 0, TblTopic)));
TblStarted := False;
TblClosed := True;
end;
if not SectionClosed then begin
if Pos ('CMOS', StUpcase2 (FileName)) > 0 then begin
CMOS^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
CMOS, CMOSName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('FARCALL', StUpcase2 (FileName)) > 0 then begin
FarCall^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
FarCall, FarCallName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('MEMORY', StUpcase2 (FileName)) > 0 then begin
Memory^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
Memory, MemoryName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('MSR', StUpcase2 (FileName)) > 0 then begin
MSR^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
MSR, MSRName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('OPCODES', StUpcase2 (FileName)) > 0 then begin
OpCodes^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
OpCodes, OpCodesName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('PORTS', StUpcase2 (FileName)) > 0 then begin
Ports^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
Ports, PortsName, CurInt, CurSubF, CurCat, True);
end else
if (FileIsATopic = '')
and ((not (ExtendedHeader [2] in HexChars))
or (not (ExtendedHeader [3] in HexChars)))
then begin
IntList^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
IntList, IntListName, CurInt, CurSubF, CurCat, True);
end;
Topic^.SetHeader (NoLinks (ExtendedHeader));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
TopicName, 0, Topic)));
SectionClosed := True;
end;
ProcessHdr (Str);
if (StUpcase2 (TopicName) <> 'SECTION') then begin
New (Topic, Init (1, 1));
SectionStarted := True;
SectionClosed := False;
TopicName := MakeCorrectTopicName (TopicName);
OriginalTopicName := TopicName;
ExtendedHeader := #2 + TopicName + #2;
Write (TopicName: 31, ' mem - ', MaxAvail: 8, #13);
end else
SectionStarted := False;
end else begin
if SectionStarted then begin
Tab2Spc (Str);
StrUp := StUpcase2 (Str);
if (Copy (StrUp, 1, 4) = 'INT ')
and (StrUp [5] in HexChars) and (StrUp [6] in HexChars)
and (Pos ('INT', StUpcase2 (FileName)) > 0) then begin
I := (Pos (StrUp [5], HexCh) - 1)*16 + Pos (StrUp [6], HexCh) - 1;
IntLists [I]^.AddKeyword (OriginalTopicName, 0);
ExtendedHeader := #2 + TopicName + #2
+ Copy (Str, 7, Length (Str) - 6);
AddStr2Topic (ExtendedHeader,
IntLists [I], string (Pointer(@IntNames [I])^), CurInt, CurSubF, CurCat, True);
end;
if (Copy (StrUp, 1, 5) = 'CMOS ')
and (StrUp [6] in HexChars) and (StrUp [7] in HexChars)
and (StrUp [8] = 'H') then begin
if (StrUp [9] = '-')
and (StrUp [10] in HexChars) and (StrUp [11] in HexChars)
and (StrUp [12] = 'H') then
ExtendedHeader := Copy (Str, 13, Length (Str) - 12)
else
ExtendedHeader := Copy (Str, 9, Length (Str) - 8);
ExtendedHeader := #2 + TopicName + #2 + ExtendedHeader;
end;
if (Copy (StrUp, 1, 5) = 'CALL ')
and (StrUp [6] in HexChars + ['X']) and (StrUp [7] in HexChars + ['X'])
and (StrUp [8] in HexChars + ['X']) and (StrUp [9] in HexChars + ['X'])
and (StrUp [10] = 'H')
and (StrUp [11] = ':')
and (StrUp [12] in HexChars + ['X']) and (StrUp [13] in HexChars + ['X'])
and (StrUp [14] in HexChars + ['X']) and (StrUp [15] in HexChars + ['X'])
and (StrUp [16] = 'H')
then begin
ExtendedHeader := #2 + TopicName + #2
+ Copy (Str, 17, Length (Str) - 16);
end;
if (Copy (StrUp, 1, 4) = 'MEM ')
and (StrUp [5] in HexChars + ['X']) and (StrUp [6] in HexChars + ['X'])
and (StrUp [7] in HexChars + ['X']) and (StrUp [8] in HexChars + ['X'])
then
if (StrUp [9] = 'H')
and (StrUp [10] = ':')
and (StrUp [11] in HexChars + ['X']) and (StrUp [12] in HexChars + ['X'])
and (StrUp [13] in HexChars + ['X']) and (StrUp [14] in HexChars + ['X'])
and (StrUp [15] = 'H')
then
ExtendedHeader := #2 + TopicName + #2
+ Copy (Str, 16, Length (Str) - 15)
else
if (StrUp [9] in HexChars + ['X']) and (StrUp [10] in HexChars + ['X'])
and (StrUp [11] in HexChars + ['X']) and (StrUp [12] in HexChars + ['X'])
and (StrUp [13] = 'H')
then
ExtendedHeader := #2 + TopicName + #2
+ Copy (Str, 14, Length (Str) - 13);
if (Copy (StrUp, 1, 4) = 'MSR ')
and (StrUp [5] in HexChars + ['X']) and (StrUp [6] in HexChars + ['X'])
and (StrUp [7] in HexChars + ['X']) and (StrUp [8] in HexChars + ['X'])
and (StrUp [9] in HexChars + ['X']) and (StrUp [10] in HexChars + ['X'])
and (StrUp [11] in HexChars + ['X']) and (StrUp [12] in HexChars + ['X'])
and (StrUp [13] = 'H')
then begin
ExtendedHeader := #2 + TopicName + #2
+ Copy (Str, 14, Length (Str) - 13);
end;
if (Copy (StrUp, 1, 7) = 'OPCODE ')
then begin
for I := 8 to Length (StrUp) do
if StrUp [I] = ' ' then Break;
if (I > 8)
and (Pos (Copy (StrUp, 8, I - 8), StUpcase2 (TopicName)) > 0) then
ExtendedHeader := #2 + TopicName + #2
+ Copy (Str, I, Length (Str) - I + 1);
end;
if (Copy (StrUp, 1, 5) = 'PORT ')
and (StrUp [6] in HexChars) and (StrUp [7] in HexChars)
and (StrUp [8] in HexChars) and (StrUp [9] in HexChars)
then begin
if (StrUp [10] = '-')
and (StrUp [11] in HexChars + ['?']) and (StrUp [12] in HexChars + ['?'])
and (StrUp [13] in HexChars + ['?']) and (StrUp [14] in HexChars + ['?', 'x', ' '])
then
ExtendedHeader := Copy (Str, 15, Length (Str) - 14)
else
ExtendedHeader := Copy (Str, 10, Length (Str) - 9);
ExtendedHeader := #2 + TopicName + #2 + ExtendedHeader;
end;
if (ExtendedHeader = #2 + TopicName + #2)
and (Str <> '') then
ExtendedHeader := #2 + TopicName + #2' ' + Str;
if KeyNames. Count > 0 then
for I := 0 to KeyNames. Count - 1 do begin
J := Pos (StUpcase2 (PString (KeyNames. At (I))^), StrUp);
if (J > 0)
and ((PTopic (KeyLists. At (I))^. Count = 0)
or (PString (PTopic (KeyLists. At (I))^. At (
PTopic (KeyLists. At (I))^. Count - 1))^
<> ' ' + ExtendedHeader))
then begin
PTopic (KeyLists. Items^ [I])^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
PTopic (KeyLists. Items^ [I]),
PString (KeyNames. At (I))^, CurInt, CurSubF, CurCat, True);
end;
end;
I := Pos ('TABLE', StrUp);
if (I > 0) and (I + 9 <= Length (Str))
and (Str [I + 6] in ['0'..'9', 'C', 'F', 'M', 'R', 'P'])
and (Str [I + 7] in ['0'..'9'])
and (Str [I + 8] in ['0'..'9'])
and (Str [I + 9] in ['0'..'9'])
then begin
if not TblClosed then begin
PrevStr := TblTopic^.At (TblTopic^.Count - 1);
if (PrevStr <> nil) and (PrevStr^ <> '') and (PrevStr^ <> ' ') then begin
TblTopic^. AtDelete (TblTopic^.Count - 1);
if PrevStr <> nil then begin
J := Pos (#2, PrevStr^);
while J > 0 do begin
SavePtr := PrevStr;
PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
+ Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
DisposeStr (SavePtr);
J := Pos (#2, PrevStr^);
if J = 0 then
WriteLn ('error 5');
SavePtr := PrevStr;
PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
+ Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
DisposeStr (SavePtr);
TblTopic^. Keywords. AtFree (TblTopic^. Keywords. Count - 1);
J := Pos (#2, PrevStr^);
end;
end;
end else
PrevStr := nil;
TblTopic^.AddKeywordAtStart (OriginalTopicName);
TblTopic^.SetSubHeader (ExtendedHeader);
FO. IdxTbl. Insert (New (PIndexEntry, Init (
TblTopicName, 0, TblTopic)));
TblStarted := False;
TblClosed := True;
end else begin
PrevStr := Topic^.At (Topic^.Count - 1);
if (PrevStr <> nil) and (PrevStr^ <> '') and (PrevStr^ <> ' ') then begin
Topic^. AtDelete (Topic^.Count - 1);
if PrevStr <> nil then begin
J := Pos (#2, PrevStr^);
while J > 0 do begin
SavePtr := PrevStr;
PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
+ Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
DisposeStr (SavePtr);
J := Pos (#2, PrevStr^);
if J = 0 then
WriteLn ('error 5');
SavePtr := PrevStr;
PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
+ Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
DisposeStr (SavePtr);
Topic^. Keywords. AtFree (Topic^. Keywords. Count - 1);
J := Pos (#2, PrevStr^);
end;
end;
end else
PrevStr := nil;
end;
New (TblTopic, Init (1, 1));
TblStarted := True;
TblClosed := False;
TblTopicName := MakeCorrectTopicName ('#' + Copy (Str, I + 6, 4));
if (PrevStr <> nil) and (PrevStr^ <> '') and (PrevStr^ <> ' ')
then begin
if Pos (#2, PrevStr^) > 0 then begin
WriteLn (PrevStr^);
WriteLn ('error 4');
end;
AddStr2Topic (PrevStr^, TblTopic, TblTopicName, CurInt, CurSubF, CurCat, False);
AddStr2Topic (TblTopicName + PrevStr^, Topic, TopicName, CurInt, CurSubF, CurCat, True);
TblTopic^.SetHeader (PrevStr^);
Tables^.AddKeyword (TopicName, 0);
AddStr2Topic (TblTopicName + ' '#2 + TopicName + #2
+ PrevStr^, Tables, TablesName, CurInt, CurSubF, CurCat, True);
end else
AddNextStringToTopicAsATblRef := True;
DisposeStr (PrevStr);
AddStr2Topic (Str, TblTopic, TblTopicName, CurInt, CurSubF, CurCat, False);
end else begin
if TblStarted then begin
if AddNextStringToTopicAsATblRef then begin
AddStr2Topic (TblTopicName + ' ' + Str, Topic, TopicName, CurInt, CurSubF, CurCat, True);
TblTopic^.SetHeader (Str);
Tables^.AddKeyword (TopicName, 0);
AddStr2Topic (TblTopicName + ' '#2 + TopicName + #2
+ ' ' + Str, Tables, TablesName, CurInt, CurSubF, CurCat, True);
AddNextStringToTopicAsATblRef := False;
end;
AddStr2Topic (Str, TblTopic, TblTopicName, CurInt, CurSubF, CurCat, False);
end;
end;
if not TblStarted then
AddStr2Topic (Str, Topic, TopicName, CurInt, CurSubF, CurCat, True);
end;
end;
end;
if not TblClosed then begin
TblTopic^.AddKeywordAtStart (OriginalTopicName);
TblTopic^.SetSubHeader (ExtendedHeader);
FO. IdxTbl. Insert (New (PIndexEntry, Init (
TblTopicName, 0, TblTopic)));
TblStarted := False;
TblClosed := True;
end;
if not SectionClosed then begin
if Pos ('CMOS', StUpcase2 (FileName)) > 0 then begin
CMOS^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
CMOS, CMOSName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('FARCALL', StUpcase2 (FileName)) > 0 then begin
FarCall^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
FarCall, FarCallName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('MEMORY', StUpcase2 (FileName)) > 0 then begin
Memory^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
Memory, MemoryName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('MSR', StUpcase2 (FileName)) > 0 then begin
MSR^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
MSR, MSRName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('OPCODES', StUpcase2 (FileName)) > 0 then begin
OpCodes^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
OpCodes, OpCodesName, CurInt, CurSubF, CurCat, True);
end else
if Pos ('PORTS', StUpcase2 (FileName)) > 0 then begin
Ports^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
Ports, PortsName, CurInt, CurSubF, CurCat, True);
end else
if (FileIsATopic = '')
and ((not (ExtendedHeader [2] in HexChars))
or (not (ExtendedHeader [3] in HexChars)))
then begin
IntList^.AddKeyword (OriginalTopicName, 0);
AddStr2Topic (ExtendedHeader,
IntList, IntListName, CurInt, CurSubF, CurCat, True);
end;
Topic^.SetHeader (NoLinks (ExtendedHeader));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
TopicName, 0, Topic)));
SectionClosed := True;
end;
Close (FI);
end else
ProcessInterrup := False;
end;
var
Param: string;
C: Char;
T: PTopic;
I: Integer;
KeyFile: Text;
KeyStr: string;
BoldFile: Text;
BoldStr: string;
SwapFileSize: Longint;
F: file;
begin
WriteLn;
WriteLn ('=== Int2RTF Interrupt List Compiler v1.2 Copyright (C) 1996 Slava Gostrenko ===');
WriteLn;
for I := 1 to ParamCount do begin
Param := StUpcase2 (ParamStr (I));
if Param [1] in ['/', '\', '-'] then
if Param [2] in ['?', 'H'] then begin
WriteLn ('Converts Ralf Brown''s Interrupt List into Rich Text Format (.RTF)');
WriteLn ('to compile it further into windows help file (.HLP) with HC31.EXE.');
WriteLn;
WriteLn ('Usage: Int2RTF <enter>');
Exit;
end;
end;
SwapFileSize := Longint (6144)*1024 - MemAvail;
if SwapFileSize > 0 then
SwapFileSize := SwapFileSize and (-1024)
else
SwapFileSize := 0;
if SwapFileSize > 0 then begin
MemInitSwapFile ('int2rtf.swp', SwapFileSize);
WriteLn ('swap file size - ', SwapFileSize);
end;
New (SwapFile, Init ('topics.swp', stCreate, 2048));
Hdrs. Init (256, 256);
FO. Init ('intwin.rtf', stCreate, 32768);
Assign (IncompPattern, 'incomplt.log');
Rewrite (IncompPattern);
New (T, Init (16, 16));
T^. AddString ('Visit the home page of Slava Gostrenko at http://sunny.aha.ru/~gw/');
T^. AddString (' ');
T^. AddString ('There you may check for the latest versions of Int2RTF and other software.');
T^. AddString ('You can register on my page to get automatic notifications when Interrupt');
T^. AddString ('List or Int2RTF is updated.');
T^. AddString (' ');
T^. AddString ('=== ARVID AUDIO ===');
T^. AddString (' ');
T^. AddString ('is a CD quality digital audio tape recorder made of Sound Blaster sound card');
T^. AddString ('and Arvid streamer board. Arvid is a PC board priced at as little as $60');
T^. AddString ('that makes a streamer of your home video tape recorder. It is capable of');
T^. AddString ('storing 2 GigaBytes of data on a single tape. With the help of Arvid Audio');
T^. AddString ('software you may record 3 hours of digital audio sound on a regular 180 min.');
T^. AddString ('videotape. Arvid Audio records from all audio sources available on(via) a');
T^. AddString ('Sound Blaster sound card, e.i. CD player, Microphone, Line In. And now it is');
T^. AddString ('capable of Direct Digital Recording From CD! Download it now and you will');
T^. AddString ('get 3 hours of 44.1 kHz 16 bit stereo sound on a $2 videotape! Visit my home');
T^. AddString ('page for more info and references.');
T^. AddString (' ');
T^. AddString ('=== ARVID DRAW ===');
T^. AddString (' ');
T^. AddString ('copies a text file to the TV screen via Arvid. Requires Arvid 1031.');
T^. AddString (' ');
T^. AddString ('=== CD2WAV ===');
T^. AddString (' ');
T^. AddString ('is a CD-DA (Digital Audio) grabber with an advanced jitter correction');
T^. AddString ('algorithm.');
T^. AddString (' ');
T^. AddString ('=== CD2SB ===');
T^. AddString (' ');
T^. AddString ('is a CD-DA (Digital Audio) player that plays CDs via your sound card''s DAC');
T^. AddString ('(Digital-to-Analog Converter) rather then CD-ROM drive''s DAC. So you can');
T^. AddString ('compare the quality of the DACs. Requires Sound Blaster SB16.');
T^. AddString (' ');
T^. AddString ('=== INT2TPH ===');
T^. AddString (' ');
T^. AddString ('is a program that converts Ralf Brown''s Interrupt List into Borland Turbo');
T^. AddString ('Help File (.TPH file format) to use it with Turbo Help TSR or within Borland');
T^. AddString ('(Turbo) Pascal IDE. Int2TPH uses hypertext features of the Interrupt List.');
T^. AddString ('It is the first (and the only) Interrupt List compiler that makes a real');
T^. AddString ('hypertext of the Interrupt List. It is made possible due to an advanced');
T^. AddString ('pattern processing technique used in the compiler. Not only it creates');
T^. AddString ('comprehensive indexes for all the topics in the list but it also allows');
T^. AddString ('users to add their own indexes to the help file. Int2TPH is distributed with');
T^. AddString ('source texts!');
T^. AddString (' ');
T^. AddString ('=== BORLAND PASCAL AUTO CORRECTOR ===');
T^. AddString (' ');
T^. AddString ('is a program that makes it much easier to edit your programs in Borland');
T^. AddString ('Pascal''s IDE. Using expandable dictionary BP Auto Corrector beautifies your');
T^. AddString ('sources on the fly. Type "tmysuperobject" and look at the screen. You will');
T^. AddString ('see "TMySuperObject". And you do not have to press shift keys to type such a');
T^. AddString ('nice identifiers. AutoSave feature will unglue your hands from <F2> key.');
T^. AddString ('VideoSubst feature will enable Borland Pascal''s IDE to work in video modes');
T^. AddString ('others than 80x25 and 80x50. Now you may set up your BP to work in any text');
T^. AddString ('video mode that is supported by your video card. You may use VESA video');
T^. AddString ('modes too and enjoy modes with the resolution up to 132x60! Auto Corrector');
T^. AddString ('includes patches for BP to make a real full screen editor with no menu and');
T^. AddString ('status lines. It means 2 more lines will be used for displaying your source');
T^. AddString ('texts.');
T^. AddString (' ');
T^. AddString ('=== TICKTOSS ===');
T^. AddString (' ');
T^. AddString ('is a fileechoprocessor for end-user fidonet systems. TickToss is just a .bat');
T^. AddString ('file. No .exe''s or .com''s. But it has all the features an end-user ever');
T^. AddString ('needs. Automatic creation of new fileechoes with meaningful directory names.');
T^. AddString ('Creating and updating of area configuration file. Creating and updating of');
T^. AddString ('files.bbs''s in your fileecho areas. Support for long multilined file');
T^. AddString ('descriptions. Logging of performed actions. And all the abovelisted features');
T^. AddString ('are implemented as a single .bat file. TickToss requires 4dos or compaitable');
T^. AddString ('command processor.');
T^. AddString (' ');
T^. AddString ('=== VOXEL EARTH ===');
T^. AddString (' ');
T^. AddString ('It is a demo of my new real-time voxel 3D engine. Download it and have a');
T^. AddString ('virtual flight over the virtual (but quite realistic) landscape. Pentium or');
T^. AddString ('better CPU is recommended.');
T^. AddString (' ');
T^. AddString ('=== And MORE... ===');
T^. AddString (' ');
T^. AddString ('Visit my homepage NOW! ;-)');
T^. AddString (' ');
FO. IdxTbl. Insert (New (PIndexEntry, Init (
'http://sunny.aha.ru/~gw/', 0, T)));
for I := Low (IntLists) to High (IntLists) do begin
New (IntLists [I], Init (16, 16));
IntNames [I] := MakeCorrectTopicName ('INT ' + HexByte (I));
end;
New (IntListIndex, Init (16, 16));
IntListIndexName := MakeCorrectTopicName (' INTERRUPT LIST INDEX ');
Assign (Interrup1st, 'interrup.1st');
{$I-}
Reset (Interrup1st);
{$I+}
if IOResult = 0 then begin
if not EOF (Interrup1st) then begin
ReadLn (Interrup1st, CopyrightStr);
Tab2Spc (CopyrightStr);
while Pos (' ', CopyrightStr) > 0 do
Delete (CopyrightStr, Pos (' ', CopyrightStr), 1);
if CopyrightStr <> '' then
IntListIndex^. SetHeader (CopyrightStr);
if not EOF (Interrup1st) then begin
ReadLn (Interrup1st, CopyrightStr);
Tab2Spc (CopyrightStr);
if CopyrightStr <> '' then
IntListIndex^. SetSubHeader (CopyrightStr);
end;
end;
Close (Interrup1st);
end;
IntListIndex^.AddString (' === This help file was compiled with ===');
IntListIndex^.AddString (' === Int2RTF v1.2 (C) 1996 Slava Gostrenko. ===');
IntListIndex^.AddKeyword ('http://sunny.aha.ru/~gw/', 0);
IntListIndex^.AddString (' === '#2'http://sunny.aha.ru/~gw/'#2' or gw@aha.ru, ===');
IntListIndex^.AddString (' === FidoNet 2:5020/201.105,2:5020/468.105. ===');
IntListIndex^.AddString (' ');
IntListIndex^.AddKeyword ('TITLES', 0);
IntListIndex^.AddString (' '#2'Interrupts'#2);
KeyLists. Init (1, 1);
KeyNames. Init (1, 1);
Assign (KeyFile, 'int_keys.txt');
{$I-}
Reset (KeyFile);
{$I+}
if IOResult = 0 then begin
while not EOF (KeyFile) do begin
ReadLn (KeyFile, KeyStr);
if KeyStr <> '' then begin
KeyLists. AtInsert (KeyLists. Count, New (PTopic, Init (1, 1)));
KeyStr := MakeCorrectTopicName (KeyStr);
KeyNames. AtInsert (KeyNames. Count, NewStr (KeyStr));
IntListIndex^.AddKeyword (KeyStr, 0);
IntListIndex^.AddString (' '#2 + KeyStr + #2);
end;
end;
Close (KeyFile);
end;
BoldNames. Init (1, 1);
Assign (BoldFile, 'int_bold.txt');
{$I-}
Reset (BoldFile);
{$I+}
if IOResult = 0 then begin
while not EOF (BoldFile) do begin
ReadLn (BoldFile, BoldStr);
if BoldStr <> '' then
BoldNames. AtInsert (BoldNames. Count, NewStr (BoldStr));
end;
Close (BoldFile);
end;
New (IntList, Init (16, 16));
IntListName := MakeCorrectTopicName ('Interrupt List Misc. Stuff');
IntListIndex^.AddKeyword (IntListName, 0);
IntListIndex^.AddString (' '#2 + IntListName + #2);
New (Tables, Init (16, 16));
TablesName := MakeCorrectTopicName ('Tables');
IntListIndex^.AddKeyword (TablesName, 0);
IntListIndex^.AddString (' '#2 + TablesName + #2);
New (CMOS, Init (16, 16));
CMOSName := MakeCorrectTopicName ('CMOS');
IntListIndex^.AddKeyword (CMOSName, 0);
IntListIndex^.AddString (' '#2 + CMOSName + #2);
New (FarCall, Init (16, 16));
FarCallName := MakeCorrectTopicName ('Far Calls');
IntListIndex^.AddKeyword (FarCallName, 0);
IntListIndex^.AddString (' '#2 + FarCallName + #2);
New (Memory, Init (16, 16));
MemoryName := MakeCorrectTopicName ('Memory');
IntListIndex^.AddKeyword (MemoryName, 0);
IntListIndex^.AddString (' '#2 + MemoryName + #2);
New (MSR, Init (16, 16));
MSRName := MakeCorrectTopicName ('Model-Specific Registers');
IntListIndex^.AddKeyword (MSRName, 0);
IntListIndex^.AddString (' '#2 + MSRName + #2);
New (OpCodes, Init (16, 16));
OpCodesName := MakeCorrectTopicName ('Opcodes List');
IntListIndex^.AddKeyword (OpCodesName, 0);
IntListIndex^.AddString (' '#2 + OpCodesName + #2);
New (Ports, Init (16, 16));
PortSName := MakeCorrectTopicName ('Ports');
IntListIndex^.AddKeyword (PortsName, 0);
IntListIndex^.AddString (' '#2 + PortsName + #2);
ProcessInterrup ('interrup.1st', '');
ProcessInterrup ('category.key', '');
ProcessInterrup ('86bugs.lst', '86 Bugs');
IntListIndex^.AddKeyword ('86 Bugs', 0);
IntListIndex^.AddString (' '#2'86 Bugs'#2);
ProcessInterrup ('biblio.lst', '');
ProcessInterrup ('cmos.lst', '');
ProcessInterrup ('farcall.lst', '');
ProcessInterrup ('glossary.lst', 'Glossary of The Interrupt List');
IntListIndex^.AddKeyword ('Glossary of The Interrupt List', 0);
IntListIndex^.AddString (' '#2'Glossary of The Interrupt List'#2);
ProcessInterrup ('memory.lst', '');
ProcessInterrup ('msr.lst', '');
ProcessInterrup ('opcodes.lst', '');
ProcessInterrup ('overview.lst', '');
ProcessInterrup ('ports.lst', '');
ProcessInterrup ('tables.lst', '');
ProcessInterrup ('interrup.pri', 'Interrupt Primer');
IntListIndex^.AddKeyword ('Interrupt Primer', 0);
IntListIndex^.AddString (' '#2'Interrupt Primer'#2);
ProcessInterrup ('rbrown.txt', 'Ralf Brown');
IntListIndex^.AddKeyword ('Ralf Brown', 0);
IntListIndex^.AddString (' '#2'Ralf Brown'#2);
if not ProcessInterrup ('interrup.lst', '') then
for C := 'a' to 'z' do
if not ProcessInterrup ('interrup.' + C, '') then
Break;
FO. IdxTbl. Insert (New (PIndexEntry, Init (
PortsName, 0, Ports)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
MemoryName, 0, Memory)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
MSRName, 0, MSR)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
OpCodesName, 0, OpCodes)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
FarCallName, 0, FarCall)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
CMOSName, 0, CMOS)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
TablesName, 0, Tables)));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
IntListName, 0, IntList)));
if KeyLists. Count > 0 then
for I := 0 to KeyLists. Count - 1 do
FO. IDXTbl. Insert (New (PIndexEntry, Init (
PString (KeyNames. At (I))^, 0, PTopic (KeyLists. Items^ [I]))));
FO. IdxTbl. Insert (New (PIndexEntry, Init (
IntListIndexName, 0, IntListIndex)));
for I := Low (IntLists) to High (IntLists) do
FO. IdxTbl. Insert (New (PIndexEntry, Init (
IntNames [I], 0, IntLists [I])));
Close (IncompPattern);
FO. Done;
WriteLn (Hdrs. Count, ' topics processed.');
Hdrs. Done;
SwapFile^.Seek (0);
SwapFile^.Truncate;
Dispose (SwapFile, Done);
Assign (F, 'topics.swp');
Erase (F);
if SwapFileSize > 0 then
MemCloseSwapFile (1);
end.